import preferences from '@ohos.data.preferences'
import { AccountInfo, UserInfo } from '../../model/UserInfo'
import { UIContext } from '@kit.ArkUI'

class PreferenceUtil {
  // 首选项实例
  pref: preferences.Preferences | null = null
  prefName: string = 'prefName'
  token: string = 'token'
  accountInfo: string = 'accountInfo'

  /*
    * 初始化preferences实例
    * @context  应用上下文
   */
  async loadPreference(context) {
    try {
      this.pref = await preferences.getPreferences(context, this.prefName)
      console.log(`preferences[${this.prefName}]初始化成功`)
    } catch (err) {
      console.error(`preferences[${this.prefName}]初始化失败`)
      console.error('err: ', JSON.stringify(err))
    }
  }

  /*
    * 销毁preferences实例 - 缓存、持久化文件一并销毁
    * @context  应用上下文
   */
  async delPreference(context) {
    try {
      await preferences.deletePreferences(context, this.prefName)
      console.log(`preferences[${this.prefName}]销毁成功`)
    } catch (err) {
      console.error(`preferences[${this.prefName}]销毁失败`)
      console.error('err: ', JSON.stringify(err))
    }
  }

  /*
    * 从preferences实例中获取键对应的值
    * @key            健
    * @defaultValue   获取失败时，返回的值
   */
  async get(key: string, defaultValue: preferences.ValueType): Promise<preferences.ValueType> {

    let value: preferences.ValueType = defaultValue

    // 获取对应的值之前，先判断preferences是否初始化完成
    if (!this.pref) {
      console.error(`preferences[${this.prefName}]尚未初始化！`)
      return value
    }

    await this.pref.get(key, defaultValue).then((data) => {
      value = data
      console.log(`读取preferences[${key} = ${value}]成功`)
    }).catch((err) => {
      console.error(`读取preferences[${key}]失败 `, JSON.stringify(err))
    });

    return value
  }

  /*
  * 从Preferences实例中写入数据
  * @key        健
  * @value      值
 */
  async put(key: string, value: preferences.ValueType) {

    // 写入数据之前，先判断preferences是否初始化完成
    if (!this.pref) {
      console.error(`preferences[${this.prefName}]尚未初始化！`)
      return
    }

    try {
      await this.pref.put(key, value)
      // 持久化
      await this.pref.flush()
      console.log(`保存preferences[${key} = ${value}]成功`)
    } catch (err) {
      console.error(`保存preferences[${key} = ${value}]失败`, JSON.stringify(err))
    }

  }

  // 保存用户信息
  async saveAccountInfo(accountInfo: AccountInfo) {
    this.put(this.accountInfo, accountInfo);
  }

  // 清除用户信息
  async clearAccountInfo() {
    await this.put(this.accountInfo, '')
  }

  // 保存token
  async saveToken(token: string) {
    this.put(this.token, token);
  }

  // 清除token
  async clearToken() {
    await this.put(this.token, '')
  }

  // 退出登录
  async logout(context: UIContext) {
    this.clearAccountInfo()
    this.clearToken()
    // 清除所有页面栈并跳转登录页
    context.getRouter().clear()
    context.getRouter().replaceUrl({ url: 'pages/LoginPage' })
  }
}

const preferenceUtil = new PreferenceUtil()

export default preferenceUtil as PreferenceUtil